//: net/mindview/util/TaskManager.java
// Managing and executing a queue of tasks.
package net.mindview.util;

import java.util.concurrent.*;
import java.util.*;

public class TaskManager<R, C extends Callable<R>> extends ArrayList<TaskItem<R, C>>
{
    private ExecutorService exec = Executors.newSingleThreadExecutor();
    
    public void add(C task)
    {
        add(new TaskItem<R, C>(exec.submit(task), task));
    }
    
    public List<R> getResults()
    {
        Iterator<TaskItem<R, C>> items = iterator();
        List<R> results = new ArrayList<R>();
        while (items.hasNext())
        {
            TaskItem<R, C> item = items.next();
            if (item.future.isDone())
            {
                try
                {
                    results.add(item.future.get());
                }
                catch (Exception e)
                {
                    throw new RuntimeException(e);
                }
                items.remove();
            }
        }
        return results;
    }
    
    public List<String> purge()
    {
        Iterator<TaskItem<R, C>> items = iterator();
        List<String> results = new ArrayList<String>();
        while (items.hasNext())
        {
            TaskItem<R, C> item = items.next();
            // Leave completed tasks for results reporting:
            if (!item.future.isDone())
            {
                results.add("Cancelling " + item.task);
                item.future.cancel(true); // May interrupt
                items.remove();
            }
        }
        return results;
    }
} /// :~
